package cn.kinoko.common.utils;

import cn.hutool.http.HttpUtil;
import net.coobird.thumbnailator.Thumbnails;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @author kk
 */
public class ImgUtil extends cn.hutool.core.img.ImgUtil {

    /**
     * 将任意格式的图片 InputStream 转换为 JPG 格式的 InputStream。
     *
     * @param inputStream 任意格式的 InputStream
     * @return JPG 格式的 InputStream
     * @throws IOException 如果在处理过程中出现 I/O 错误
     */
    public static InputStream convertToJpg(InputStream inputStream) throws IOException {
        // 从 PNG 输入流中读取图像
        BufferedImage image = ImageIO.read(inputStream);

        // 创建 ByteArrayOutputStream 用于存储 JPG 图像数据
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        // 使用 Thumbnails of Java 库将图像转换为 JPG 并写入 ByteArrayOutputStream
        Thumbnails.of(image)
                .outputFormat("jpg")
                .toOutputStream(baos);

        // 重置 ByteArrayOutputStream 的位置到起始位置
        baos.reset();

        // 将 ByteArrayOutputStream 转换为 ByteArrayInputStream
        return new ByteArrayInputStream(baos.toByteArray());
    }

    /**
     * 下载图片，并返回 InputStream。
     *
     * @param url 图片的 URL
     * @return InputStream
     * @throws IOException 如果在处理过程中出现 I/O 错误
     */
    public static InputStream download(String url) throws IOException {
        return download(url, -1);
    }

    /**
     * 下载图片，并返回 InputStream。
     *
     * @param url 图片的 URL
     * @param limitMB 图片大小限制，单位为 MB，如果小于等于 0，则不进行压缩
     * @return InputStream
     * @throws IOException 如果在处理过程中出现 I/O 错误
     */
    public static InputStream download(String url, Integer limitMB) throws IOException {
        byte[] bytes = HttpUtil.downloadBytes(url);
        int targetSize = limitMB * 1024 * 1024;
        // 判断图片大小，如果大于限制大小，则进行压缩
        if (limitMB > 0 && bytes.length > targetSize) {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            // 预估压缩比例
            double scale = Math.sqrt(targetSize / (double) bytes.length);
            // 使用 Thumbnails of Java 库将图像压缩到目标大小
            Thumbnails.of(new ByteArrayInputStream(bytes))
                    .scale(scale)
                    .outputFormat("jpeg")
                    .toOutputStream(baos);
            bytes = baos.toByteArray();
        }
        return new ByteArrayInputStream(bytes);
    }

}
